﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;
using Estructuras.Estructura;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaBDSql
{
    public class ConsolaBDSql
    {
        static int Main(string[] args)
        {
            try
            {
                long filasProcesadas = 0;
                Console.Error.WriteLine(Constantes.MensajeComponente + CBDSql.NodoRaiz);
                Console.Error.WriteLine(Constantes.MensajeInicio + DateTime.Now.ToLocalTime());
                if (args.Length != 1)
                    throw new Excepcion(Constantes.ERROR_NUMERO_PARAMETROS_ENTRADA, Constantes.CODIGO_ERROR_NUMERO_PARAMETROS_ENTRADA);

                PBDSql propiedades = new PBDSql();
                propiedades.leer(args[0]);

                ObtenerElementos elementos = new ObtenerElementos();

                // Obtiene el origen de los datos
                TextReader entrada = elementos.ObtenerOrigenDatos(propiedades.Entrada);

                // Obtiene la estructura de entrada de los datos
                Estructura.Estructura formatoEntrada = elementos.ObtenerEstructura(propiedades.EstructuraEntrada);

                // Obtiene el fichero de instrucciones SQL
                TextReader ficheroSQL = elementos.ObtenerOrigenDatos(propiedades.FicheroSQL);

                try
                {
                    switch (propiedades.TipoBD)
                    {
                        case TipoBaseDatos.ODBC:
                            filasProcesadas = Estructuras.Funciones.BaseDatos.Ejecutar.EjecutarSQL(entrada,
                                ficheroSQL, propiedades.CadenaConexion, formatoEntrada);
                            break;
                        case TipoBaseDatos.Oracle:
                            filasProcesadas = Estructuras.Funciones.BaseDatos.Oracle.Ejecutar.EjecutarSQL(entrada,
                                ficheroSQL, propiedades.CadenaConexion, formatoEntrada);
                            break;
                        case TipoBaseDatos.SQLServer:
                            filasProcesadas = Estructuras.Funciones.BaseDatos.SqlServer.Ejecutar.EjecutarSQL(entrada,
                                ficheroSQL, propiedades.CadenaConexion, formatoEntrada);
                            break;
                        default:
                            throw new Excepcion(Constantes.ERROR_TIPO_BASE_DATOS_NO_DEFINIDO, Constantes.CODIGO_ERROR_TIPO_BASE_DATOS_NO_DEFINIDO);
                    }
                }
                catch (Excepcion ex)
                {
                    throw new Excepcion(Constantes.ERROR_EJECUCION + ex.Message, ex, ex.Codigo);
                }
                catch (Exception ex)
                {
                    throw new Excepcion(Constantes.ERROR_EJECUCION + ex.Message, ex, Constantes.CODIGO_ERROR_EJECUCION);
                }

                // Cierra el fichero SQL
                elementos.CerrarOrigenDatos(ficheroSQL);

                // Cierra el fichero de entrada
                elementos.nombreFicheroEntrada = propiedades.Entrada;
                elementos.CerrarOrigenDatos(entrada);
                
                Console.Error.WriteLine(Constantes.MensajeFin + DateTime.Now.ToLocalTime());
                Console.Error.WriteLine(Constantes.MensajeRegistrosTotales + filasProcesadas.ToString());
                return Constantes.EJECUCION_OK;
            }
            catch (Excepcion ex)
            {
                Console.Error.WriteLine(ex.Message);
                return ex.Codigo;
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.Message);
                return Constantes.EJECUCION_ERROR;
            }
        }
    }
}
